原本的策略都是使用100%資金下單,髓然簡單但風險超高,所以改進了四個重點固定金額倉位、固定比例倉位、根據波動度調整、加入止損/止盈。
for i in range(1, len(df_test)):
price_prev = df_test["close"].iloc[i - 1]
price_now = df_test["close"].iloc[i]
rsi = df_test["RSI"].iloc[i]
pred = df_test["Pred"].iloc[i - 1]
atr = df_test["ATR"].iloc[i]
# 如果沒有持倉,檢查是否進場
if position is None:
if pred == 1 and rsi > 50:
position = "long"
entry_price = price_now
entry_capital = balance * position_size_ratio
balance -= entry_capital * fee_rate # 扣手續費
elif pred == 0 and rsi < 50:
position = "short"
entry_price = price_now
entry_capital = balance * position_size_ratio
balance -= entry_capital * fee_rate # 扣手續費
# 若已有持倉,檢查出場條件
elif position == "long":
change = (price_now - entry_price) / entry_price
stop_loss = -atr_multiplier * atr / entry_price
take_profit = take_profit_ratio
if change <= stop_loss or change >= take_profit:
pnl = entry_capital * change
balance += entry_capital + pnl - entry_capital * fee_rate
trades.append(pnl / entry_capital)
position = None
elif position == "short":
change = (entry_price - price_now) / entry_price
stop_loss = -atr_multiplier * atr / entry_price
take_profit = take_profit_ratio
if change <= stop_loss or change >= take_profit:
pnl = entry_capital * change
balance += entry_capital + pnl - entry_capital * fee_rate
trades.append(pnl / entry_capital)
position = None
equity_curve.append(balance)
df_test["Equity"] = equity_curve